Auftragserfassung: Automatische (Positions-) Texte

In der Auftragserfassung (Modulpool SAPMV45A) sollen bei Auftragsanlage oder -änderung kundenindividuelle Texte definiert werden.

Standard-Textfindung

Im Standard lässt sich bereits eine umfangreiche Textfindung einstellen. Hier geht es jedoch darum, Texte aus anderen Objekten (Vorgängerbelegen, Kunden, Materialien, …) zu finden und zu übernehmen.

Ausgangspunkt ist die Transaktion VOFM, Menü Kopierbedingungen • Texte oder Datenübernahme • Texte. Hier kannst du Bedingungen programmieren und zuordnen, die den gewünschten Text ermitteln.

Textverwaltung in SAP

In diesem Artikel geht es darum, individuelle Texte in eine Auftragsposition zu bekommen. Um das zu realisieren, muss man wissen, wie die Textverwaltung im SAP funktioniert. Darum hier ein kurzer Abriss zu den SAP-Langtexten.

Standardlangtexte können in der Transaktion SO10 erstellt und bearbeitet werden. Zur Bearbeitung hast die Auswahl zwischen dem uralten Zeilen-Editor und dem PC-Editor, der zwischenzeitlich durch Microsoft Word abgelöst wurde.

Absatzformate

Ein SAP-Langtext oder auch SAP-Script- oder ITF-Text, besteht aus einem Absatzformat und einer Zeile. Absatzformate können in Stilen definiert und zugeordnet werden (Transaktion SE72).

Das Sternchen * ist das Standardabsatzformat. Steht das * in der Spalte Absatzformat, dann erfolgt auf jeden Fall ein Zeilenumbruch. Bei einem Fließtext ist das Absatzformat leer.

Alter Zeileneditor
Microsoft Word Editor

Felder

Um einen Text eindeutig zu identifizieren, sind die folgenden Felder notwendig:

FeldnameBeschreibungInfos
TDOBJECTTextobjektDefiniert den Anwendungsbereich. Standardtexte haben das Textobjekt TEXT, Auftragskopftexte VBBK und Auftragspositionstexte VBBP, Materialstamm hat MATERIAL und MVKE. Textobjekte werden mit Hilfe der Transaktion SE75 definiert. Für eigene Anwendungen können im Kundennamensraum eigene Objekte definiert werden.
TDNAMETextnameDer Textname besteht bei Texten zu Anwendungsobjekten (Aufträge, Kunden, Materialien, etc.) aus den Schlüsselfeldern der zugehörigen Tabelle. Beispiel: Vertriebstext Material (MVKE): <matnr><vkorg><vtweg>
TDIDText-IDDie Id definiert Texte innerhalb eines Text-Objektes. Sie muss im Customizing definiert werden (Transaktion SE75).
TDSPRASSpracheSprache des Textes.
Schlüsselfelder STXH

Speicherort

Die Texte werden in den Tabellen STXH (Kopfdaten) und STXL (Textzeilen) gespeichert. Die Tabelle STXH kann man in der Tabellenanzeige (Transaktion SE16n) einsehen. In der STXL werden die Textzeilen jedoch komprimiert gespeichert und können nicht angesehen werden.

Texte lesen

Um Texte einzulesen, solltest du den Funktionsbaustein READ_TEXT verwenden. Um Texte zu suchen, kannst du direkt die Tabelle STXH durchsuchen oder du verwendest den Funktionsbaustein SELECT_TEXT.

Speichern von Texten

Die Speicherung von Texten erfolgt mit Hilfe des Funktionsbausteins SAVE_TEXT. Diesem Baustein müssen die Schlüsselfelder übergeben werden. Wenn man weiß, dass der Text noch nicht existiert, dann sollte aus Performancegründen der Parameter INSERT = X gesetzt werden. Möchte man den Text in einer eigenen Anwendung sofort sichern, so kann der Parameter SAVEMODE_DIRECT = X gesetzt werden. Beim Speichern von mehreren Texten sollte der Funktionsbaustein COMMIT_TEXT verwendet werden.

Mit dem Funktionsbaustein INIT_TEXT können Texte angelegt werden.

Funktionsbaustein DELETE_TEXT löscht vorhandene Texte.

Zentrales Textmemory

Die Textverwaltung hat ein zentrales Memory. Aus diesem Grund sollte immer mit den entsprechenden Funktionsbausteinen auf die Texte zugegriffen werden. Der READ_TEXT liest den Text aus dem Textmemory, sofern vorhanden.

Textverwaltung SAPMV45A

Kommen wir nun endlich zum Ausgangsthema zurück: Programmatische Bearbeitung von Texten in der Auftragsbearbeitung (Modulpool SAPMV45A). Du solltest wegen des zentralen Textmemories zur Bearbeitung immer die oben beschriebenen Funktionsbausteine verwenden. So kannst du in der Transaktion den Baustein READ_TEXT verwenden, um zu prüfen, ob bereits ein Auftragskopftext zu einer bestimmten ID oder zu einer Position schon ein Text angelegt wurde, auch wenn diese noch nicht auf der Datenbank gespeichert wurde.

Eine separate Speicherung ist nicht notwendig bzw. sogar verboten -, denn die Speicherung erfolgt zentral durch die Applikation. Wird die Transaktion abgebrochen, dann werden die Texte auch nicht gespeichert.

Auf keinen Fall darfst du im Baustein SAVE_TEXT den Parameter SAVEMODE_DIRECT setzen, den Baustein COMMIT_TEXT oder COMMIT WORK verwenden! Das wird von der Applikation SAPMV45A beim Sichern gemacht!

Verwendest du doch einen COMMIT in den Exits, dann riskierst du einen Datenschiefstand und Fehlfunktionen von BAPIs.

Codebeispiel

In folgendem Code-Beispiel wird der Text zu einem neu eingegebenen Material aus dem Literal “ARKTX:” und dem aktuellen Artikeltext erstellt.

FORM userexit_move_field_to_vbap.
  DATA ls_header     TYPE thead.
  DATA lt_lines      TYPE STANDARD TABLE OF tline.

  IF vbap-vbeln IS INITIAL.
    ls_header-tdname   = 'XXXXXXXXXX' && vbap-posnr.
  ELSE.
    ls_header-tdname   = vbap-vbeln && vbap-posnr.
  ENDIF.
  ls_header-tdobject = 'VBBP'.
  ls_header-tdid     = '0001'.
  ls_header-tdspras  = sy-langu.
  CALL FUNCTION 'READ_TEXT'
    EXPORTING
      id        = ls_header-tdid
      language  = ls_header-tdspras
      name      = ls_header-tdname
      object    = ls_header-tdobject
      local_cat = space
    IMPORTING
      header    = ls_header
    TABLES
      lines     = lt_lines
    EXCEPTIONS
      OTHERS    = 8.
  IF sy-subrc <> 0.
    lt_lines = VALUE #( ( tdformat = '*' tdline = |test { vbap-arktx }| ) ).
    CALL FUNCTION 'SAVE_TEXT'
      EXPORTING
        header          = ls_header
        insert          = abap_true
        savemode_direct = space
        local_cat       = space
      TABLES
        lines           = lt_lines
      EXCEPTIONS
        OTHERS          = 5.
  ENDIF.

ENDFORM.
Enno Wulff